Code coverage report for src/lexer.js

Statements: 71.31% (174 / 244)      Branches: 47.62% (50 / 105)      Functions: 74.19% (23 / 31)      Lines: 71.37% (172 / 241)      Ignored: none     

All files » src/ » lexer.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 4261     1   144   1       1 129     1 261     1 54     1 1     1       1                                 1 86       1     1 1 90   90 90     1         1 40 40     1 10 10     1       1     1   1 1 27     1 27 27 27   27 89 89     27     1     1   1 1 27   27 27 27 27   27     1   116 41 27 27   14         89 40     49 1     48   48   3 3                   36     9                                                             1 36 36 36     1             1                                         1 40 40   40   40 221     40 40       40     40     40     1 1 1 1   1 1   1                         1           1 1 1     1 9   9 9   9   9 9   9 27                                                             27     27       9 9 9     9   9         9     1 373 27   346       1                 1     1   1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1            
System.register([], function (_export) {
  'use strict';
 
  var Token, Lexer, Scanner, OPERATORS, $EOF, $TAB, $LF, $VTAB, $FF, $CR, $SPACE, $BANG, $DQ, $$, $PERCENT, $AMPERSAND, $SQ, $LPAREN, $RPAREN, $STAR, $PLUS, $COMMA, $MINUS, $PERIOD, $SLASH, $COLON, $SEMICOLON, $LT, $EQ, $GT, $QUESTION, $0, $9, $A, $E, $Z, $LBRACKET, $BACKSLASH, $RBRACKET, $CARET, $_, $a, $e, $f, $n, $r, $t, $u, $v, $z, $LBRACE, $BAR, $RBRACE, $NBSP;
 
  function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  function isWhitespace(code) {
    return code >= $TAB && code <= $SPACE || code === $NBSP;
  }
 
  function isIdentifierStart(code) {
    return $a <= code && code <= $z || $A <= code && code <= $Z || code === $_ || code === $$;
  }
 
  function isIdentifierPart(code) {
    return $a <= code && code <= $z || $A <= code && code <= $Z || $0 <= code && code <= $9 || code === $_ || code === $$;
  }
 
  function isDigit(code) {
    return $0 <= code && code <= $9;
  }
 
  function isExponentStart(code) {
    return code === $e || code === $E;
  }
 
  function isExponentSign(code) {
    return code === $MINUS || code === $PLUS;
  }
 
  function unescape(code) {
    switch (code) {
      case $n:
        return $LF;
      case $f:
        return $FF;
      case $r:
        return $CR;
      case $t:
        return $TAB;
      case $v:
        return $VTAB;
      default:
        return code;
    }
  }
 
  function assert(condition, message) {
    Iif (!condition) {
      throw message || 'Assertion failed';
    }
  }
  return {
    setters: [],
    execute: function () {
      Token = (function () {
        function Token(index, text) {
          _classCallCheck(this, Token);
 
          this.index = index;
          this.text = text;
        }
 
        Token.prototype.withOp = function withOp(op) {
          this.opKey = op;
          return this;
        };
 
        Token.prototype.withGetterSetter = function withGetterSetter(key) {
          this.key = key;
          return this;
        };
 
        Token.prototype.withValue = function withValue(value) {
          this.value = value;
          return this;
        };
 
        Token.prototype.toString = function toString() {
          return 'Token(' + this.text + ')';
        };
 
        return Token;
      })();
 
      _export('Token', Token);
 
      Lexer = (function () {
        function Lexer() {
          _classCallCheck(this, Lexer);
        }
 
        Lexer.prototype.lex = function lex(text) {
          var scanner = new Scanner(text);
          var tokens = [];
          var token = scanner.scanToken();
 
          while (token) {
            tokens.push(token);
            token = scanner.scanToken();
          }
 
          return tokens;
        };
 
        return Lexer;
      })();
 
      _export('Lexer', Lexer);
 
      Scanner = (function () {
        function Scanner(input) {
          _classCallCheck(this, Scanner);
 
          this.input = input;
          this.length = input.length;
          this.peek = 0;
          this.index = -1;
 
          this.advance();
        }
 
        Scanner.prototype.scanToken = function scanToken() {
          // Skip whitespace.
          while (this.peek <= $SPACE) {
            if (++this.index >= this.length) {
              this.peek = $EOF;
              return null;
            } else {
              this.peek = this.input.charCodeAt(this.index);
            }
          }
 
          // Handle identifiers and numbers.
          if (isIdentifierStart(this.peek)) {
            return this.scanIdentifier();
          }
 
          if (isDigit(this.peek)) {
            return this.scanNumber(this.index);
          }
 
          var start = this.index;
 
          switch (this.peek) {
            case $PERIOD:
              this.advance();
              return isDigit(this.peek) ? this.scanNumber(start) : new Token(start, '.');
            case $LPAREN:
            case $RPAREN:
            case $LBRACE:
            case $RBRACE:
            case $LBRACKET:
            case $RBRACKET:
            case $COMMA:
            case $COLON:
            case $SEMICOLON:
              return this.scanCharacter(start, String.fromCharCode(this.peek));
            case $SQ:
            case $DQ:
              return this.scanString();
            case $PLUS:
            case $MINUS:
            case $STAR:
            case $SLASH:
            case $PERCENT:
            case $CARET:
            case $QUESTION:
              return this.scanOperator(start, String.fromCharCode(this.peek));
            case $LT:
            case $GT:
            case $BANG:
            case $EQ:
              return this.scanComplexOperator(start, $EQ, String.fromCharCode(this.peek), '=');
            case $AMPERSAND:
              return this.scanComplexOperator(start, $AMPERSAND, '&', '&');
            case $BAR:
              return this.scanComplexOperator(start, $BAR, '|', '|');
            case $NBSP:
              while (isWhitespace(this.peek)) {
                this.advance();
              }
 
              return this.scanToken();
          }
 
          var character = String.fromCharCode(this.peek);
          this.error('Unexpected character [' + character + ']');
          return null;
        };
 
        Scanner.prototype.scanCharacter = function scanCharacter(start, text) {
          assert(this.peek === text.charCodeAt(0));
          this.advance();
          return new Token(start, text);
        };
 
        Scanner.prototype.scanOperator = function scanOperator(start, text) {
          assert(this.peek === text.charCodeAt(0));
          assert(OPERATORS.indexOf(text) !== -1);
          this.advance();
          return new Token(start, text).withOp(text);
        };
 
        Scanner.prototype.scanComplexOperator = function scanComplexOperator(start, code, one, two) {
          assert(this.peek === one.charCodeAt(0));
          this.advance();
 
          var text = one;
 
          if (this.peek === code) {
            this.advance();
            text += two;
          }
 
          if (this.peek === code) {
            this.advance();
            text += two;
          }
 
          assert(OPERATORS.indexOf(text) != -1);
 
          return new Token(start, text).withOp(text);
        };
 
        Scanner.prototype.scanIdentifier = function scanIdentifier() {
          assert(isIdentifierStart(this.peek));
          var start = this.index;
 
          this.advance();
 
          while (isIdentifierPart(this.peek)) {
            this.advance();
          }
 
          var text = this.input.substring(start, this.index);
          var result = new Token(start, text);
 
          // TODO(kasperl): Deal with null, undefined, true, and false in
          // a cleaner and faster way.
          Iif (OPERATORS.indexOf(text) !== -1) {
            result.withOp(text);
          } else {
            result.withGetterSetter(text);
          }
 
          return result;
        };
 
        Scanner.prototype.scanNumber = function scanNumber(start) {
          assert(isDigit(this.peek));
          var simple = this.index === start;
          this.advance(); // Skip initial digit.
 
          while (true) {
            Iif (isDigit(this.peek)) {} else Iif (this.peek === $PERIOD) {
              simple = false;
            } else Iif (isExponentStart(this.peek)) {
              this.advance();
 
              if (isExponentSign(this.peek)) {
                this.advance();
              }
 
              if (!isDigit(this.peek)) {
                this.error('Invalid exponent', -1);
              }
 
              simple = false;
            } else {
              break;
            }
 
            this.advance();
          }
 
          var text = this.input.substring(start, this.index);
          var value = simple ? parseInt(text) : parseFloat(text);
          return new Token(start, text).withValue(value);
        };
 
        Scanner.prototype.scanString = function scanString() {
          assert(this.peek === $SQ || this.peek === $DQ);
 
          var start = this.index;
          var quote = this.peek;
 
          this.advance(); // Skip initial quote.
 
          var buffer;
          var marker = this.index;
 
          while (this.peek !== quote) {
            Iif (this.peek === $BACKSLASH) {
              if (buffer === null) {
                buffer = [];
              }
 
              buffer.push(this.input.substring(marker, this.index));
              this.advance();
 
              var unescaped;
 
              if (this.peek === $u) {
                // TODO(kasperl): Check bounds? Make sure we have test
                // coverage for this.
                var hex = this.input.substring(this.index + 1, this.index + 5);
 
                if (!/[A-Z0-9]{4}/.test(hex)) {
                  this.error('Invalid unicode escape [\\u' + hex + ']');
                }
 
                unescaped = parseInt(hex, 16);
 
                for (var i = 0; i < 5; ++i) {
                  this.advance();
                }
              } else {
                unescaped = decodeURIComponent(this.peek);
                this.advance();
              }
 
              buffer.push(String.fromCharCode(unescaped));
              marker = this.index;
            } else Iif (this.peek === $EOF) {
              this.error('Unterminated quote');
            } else {
              this.advance();
            }
          }
 
          var last = this.input.substring(marker, this.index);
          this.advance(); // Skip terminating quote.
          var text = this.input.substring(start, this.index);
 
          // Compute the unescaped string value.
          var unescaped = last;
 
          Iif (buffer != null) {
            buffer.push(last);
            unescaped = buffer.join('');
          }
 
          return new Token(start, text).withValue(unescaped);
        };
 
        Scanner.prototype.advance = function advance() {
          if (++this.index >= this.length) {
            this.peek = $EOF;
          } else {
            this.peek = this.input.charCodeAt(this.index);
          }
        };
 
        Scanner.prototype.error = function error(message) {
          var offset = arguments[1] === undefined ? 0 : arguments[1];
 
          // TODO(kasperl): Try to get rid of the offset. It is only used to match
          // the error expectations in the lexer tests for numbers with exponents.
          var position = this.index + offset;
          throw new Error('Lexer Error: ' + message + ' at column ' + position + ' in expression [' + this.input + ']');
        };
 
        return Scanner;
      })();
 
      _export('Scanner', Scanner);
 
      OPERATORS = ['undefined', 'null', 'true', 'false', '+', '-', '*', '/', '%', '^', '=', '==', '===', '!=', '!==', '<', '>', '<=', '>=', '&&', '||', '&', '|', '!', '?'];
      $EOF = 0;
      $TAB = 9;
      $LF = 10;
      $VTAB = 11;
      $FF = 12;
      $CR = 13;
      $SPACE = 32;
      $BANG = 33;
      $DQ = 34;
      $$ = 36;
      $PERCENT = 37;
      $AMPERSAND = 38;
      $SQ = 39;
      $LPAREN = 40;
      $RPAREN = 41;
      $STAR = 42;
      $PLUS = 43;
      $COMMA = 44;
      $MINUS = 45;
      $PERIOD = 46;
      $SLASH = 47;
      $COLON = 58;
      $SEMICOLON = 59;
      $LT = 60;
      $EQ = 61;
      $GT = 62;
      $QUESTION = 63;
      $0 = 48;
      $9 = 57;
      $A = 65;
      $E = 69;
      $Z = 90;
      $LBRACKET = 91;
      $BACKSLASH = 92;
      $RBRACKET = 93;
      $CARET = 94;
      $_ = 95;
      $a = 97;
      $e = 101;
      $f = 102;
      $n = 110;
      $r = 114;
      $t = 116;
      $u = 117;
      $v = 118;
      $z = 122;
      $LBRACE = 123;
      $BAR = 124;
      $RBRACE = 125;
      $NBSP = 160;
    }
  };
});
 
// Do nothing.
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2JpbmRpbmcvc3JjL2xleGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztNQUFhLEtBQUssRUEwQkwsS0FBSyxFQWVMLE9BQU8sRUE0UGhCLFNBQVMsRUE0QlQsSUFBSSxFQUNKLElBQUksRUFDSixHQUFHLEVBQ0gsS0FBSyxFQUNMLEdBQUcsRUFDSCxHQUFHLEVBQ0gsTUFBTSxFQUNOLEtBQUssRUFDTCxHQUFHLEVBQ0gsRUFBRSxFQUNGLFFBQVEsRUFDUixVQUFVLEVBQ1YsR0FBRyxFQUNILE9BQU8sRUFDUCxPQUFPLEVBQ1AsS0FBSyxFQUNMLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLE9BQU8sRUFDUCxNQUFNLEVBQ04sTUFBTSxFQUNOLFVBQVUsRUFDVixHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxTQUFTLEVBRVQsRUFBRSxFQUNGLEVBQUUsRUFFRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFFRixTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFDVCxNQUFNLEVBQ04sRUFBRSxFQUVGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUVGLE9BQU8sRUFDUCxJQUFJLEVBQ0osT0FBTyxFQUNQLEtBQUs7Ozs7QUFFVCxXQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUU7QUFDMUIsV0FBTyxBQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBTSxJQUFJLEtBQUssS0FBSyxBQUFDLENBQUM7R0FDN0Q7O0FBRUQsV0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUU7QUFDL0IsV0FBTyxBQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsSUFDeEIsRUFB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ZixTQUFHLEdBQVUsRUFBRTtBQUNmLFNBQUcsR0FBVSxFQUFFO0FBQ2YsZUFBUyxHQUFJLEVBQUU7QUFFZixRQUFFLEdBQUcsRUFBRTtBQUNQLFFBQUUsR0FBRyxFQUFFO0FBRVAsUUFBRSxHQUFHLEVBQUU7QUFDUCxRQUFFLEdBQUcsRUFBRTtBQUNQLFFBQUUsR0FBRyxFQUFFO0FBRVAsZUFBUyxHQUFJLEVBQUU7QUFDZixnQkFBVSxHQUFHLEVBQUU7QUFDZixlQUFTLEdBQUksRUFBRTtBQUNmLFlBQU0sR0FBTyxFQUFFO0FBQ2YsUUFBRSxHQUFXLEVBQUU7QUFFZixRQUFFLEdBQUcsRUFBRTtBQUNQLFFBQUUsR0FBRyxHQUFHO0FBQ1IsUUFBRSxHQUFHLEdBQUc7QUFDUixRQUFFLEdBQUcsR0FBRztBQUNSLFFBQUUsR0FBRyxHQUFHO0FBQ1IsUUFBRSxHQUFHLEdBQUc7QUFDUixRQUFFLEdBQUcsR0FBRztBQUNSLFFBQUUsR0FBRyxHQUFHO0FBQ1IsUUFBRSxHQUFHLEdBQUc7QUFFUixhQUFPLEdBQUcsR0FBRztBQUNiLFVBQUksR0FBTSxHQUFHO0FBQ2IsYUFBTyxHQUFHLEdBQUc7QUFDYixXQUFLLEdBQUssR0FBRyIsImZpbGUiOiIvVXNlcnMvRWlzZW5iZXJnRWZmZWN0L0RvY3VtZW50cy9HaXRIdWIvVGhlIER1cmFuZGFsIFByb2plY3QvYXVyZWxpYS9iaW5kaW5nL3NyYy9sZXhlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKGluZGV4LCB0ZXh0KXtcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgfVxuXG4gIHdpdGhPcChvcCkge1xuICAgIHRoaXMub3BLZXkgPSBvcDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdpdGhHZXR0ZXJTZXR0ZXIoa2V5KSB7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aXRoVmFsdWUodmFsdWUpIHsgXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlOyBcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgVG9rZW4oJHt0aGlzLnRleHR9KWA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExleGVyIHtcbiAgbGV4KHRleHQpIHtcbiAgICB2YXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHRleHQpO1xuICAgIHZhciB0b2tlbnMgPSBbXTtcbiAgICB2YXIgdG9rZW4gPSBzY2FubmVyLnNjYW5Ub2tlbigpO1xuXG4gICAgd2hpbGUgKHRva2VuKSB7XG4gICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICB0b2tlbiA9IHNjYW5uZXIuc2NhblRva2VuKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2Nhbm5lciB7XG4gIGNvbnN0cnVjdG9yKGlucHV0KSB7XG4gICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIHRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgIHRoaXMucGVlayA9IDA7XG4gICAgdGhpcy5pbmRleCA9IC0xO1xuXG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gIH1cblxuICBzY2FuVG9rZW4oKSB7XG4gICAgLy8gU2tpcCB3aGl0ZXNwYWNlLlxuICAgIHdoaWxlICh0aGlzLnBlZWsgPD0gJFNQQUNFKSB7XG4gICAgICBpZiAoKyt0aGlzLmluZGV4ID49IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucGVlayA9ICRFT0Y7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wZWVrID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpZGVudGlmaWVycyBhbmQgbnVtYmVycy5cbiAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQodGhpcy5wZWVrKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NhbklkZW50aWZpZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaWdpdCh0aGlzLnBlZWspKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2FuTnVtYmVyKHRoaXMuaW5kZXgpO1xuICAgIH1cblxuICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7XG5cbiAgICBzd2l0Y2ggKHRoaXMucGVlaykge1xuICAgICAgY2FzZSAkUEVSSU9EOlxuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgcmV0dXJuIGlzRGlnaXQodGhpcy5wZWVrKSA/IHRoaXMuc2Nhbk51bWJlcihzdGFydCkgOiBuZXcgVG9rZW4oc3RhcnQsICcuJyk7XG4gICAgICBjYXNlICRMUEFSRU46XG4gICAgICBjYXNlICRSUEFSRU46XG4gICAgICBjYXNlICRMQlJBQ0U6XG4gICAgICBjYXNlICRSQlJBQ0U6XG4gICAgICBjYXNlICRMQlJBQ0tFVDpcbiAgICAgIGNhc2UgJFJCUkFDS0VUOlxuICAgICAgY2FzZSAkQ09NTUE6XG4gICAgICBjYXNlICRDT0xPTjpcbiAgICAgIGNhc2UgJFNFTUlDT0xPTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkNoYXJhY3RlcihzdGFydCwgU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnBlZWspKTtcbiAgICAgIGNhc2UgJFNROlxuICAgICAgY2FzZSAkRFE6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5TdHJpbmcoKTtcbiAgICAgIGNhc2UgJFBMVVM6XG4gICAgICBjYXNlICRNSU5VUzpcbiAgICAgIGNhc2UgJFNUQVI6XG4gICAgICBjYXNlICRTTEFTSDpcbiAgICAgIGNhc2UgJFBFUkNFTlQ6XG4gICAgICBjYXNlICRDQVJFVDpcbiAgICAgIGNhc2UgJFFVRVNUSU9OOlxuICAgICAgICByZXR1cm4gdGhpcy5zY2FuT3BlcmF0b3Ioc3RhcnQsIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5wZWVrKSk7XG4gICAgICBjYXNlICRMVDpcbiAgICAgIGNhc2UgJEdUOlxuICAgICAgY2FzZSAkQkFORzpcbiAgICAgIGNhc2UgJEVROlxuICAgICAgICByZXR1cm4gdGhpcy5zY2FuQ29tcGxleE9wZXJhdG9yKHN0YXJ0LCAkRVEsIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5wZWVrKSwgJz0nKTtcbiAgICAgIGNhc2UgJEFNUEVSU0FORDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkNvbXBsZXhPcGVyYXRvcihzdGFydCwgJEFNUEVSU0FORCwgJyYnLCAnJicpO1xuICAgICAgY2FzZSAkQkFSOlxuICAgICAgICByZXR1cm4gdGhpcy5zY2FuQ29tcGxleE9wZXJhdG9yKHN0YXJ0LCAkQkFSLCAnfCcsICd8Jyk7XG4gICAgICBjYXNlICROQlNQOlxuICAgICAgICB3aGlsZSAoaXNXaGl0ZXNwYWNlKHRoaXMucGVlaykpe1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VuKCk7XG4gICAgfVxuXG4gICAgdmFyIGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5wZWVrKTtcbiAgICB0aGlzLmVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBbJHtjaGFyYWN0ZXJ9XWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc2NhbkNoYXJhY3RlcihzdGFydCwgdGV4dCkge1xuICAgIGFzc2VydCh0aGlzLnBlZWsgPT09IHRleHQuY2hhckNvZGVBdCgwKSk7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG5ldyBUb2tlbihzdGFydCwgdGV4dCk7XG4gIH1cblxuICBzY2FuT3BlcmF0b3Ioc3RhcnQsIHRleHQpIHtcbiAgICBhc3NlcnQodGhpcy5wZWVrID09PSB0ZXh0LmNoYXJDb2RlQXQoMCkpO1xuICAgIGFzc2VydChPUEVSQVRPUlMuaW5kZXhPZih0ZXh0KSAhPT0gLTEpO1xuICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIHJldHVybiBuZXcgVG9rZW4oc3RhcnQsIHRleHQpLndpdGhPcCh0ZXh0KTtcbiAgfVxuXG4gIHNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsIGNvZGUsIG9uZSwgdHdvKSB7XG4gICAgYXNzZXJ0KHRoaXMucGVlayA9PT0gb25lLmNoYXJDb2RlQXQoMCkpO1xuICAgIHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgdmFyIHRleHQgPSBvbmU7XG4gICAgXG4gICAgaWYgKHRoaXMucGVlayA9PT0gY29kZSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB0ZXh0ICs9IHR3bztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wZWVrID09PSBjb2RlKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHRleHQgKz0gdHdvO1xuICAgIH1cblxuICAgIGFzc2VydChPUEVSQVRPUlMuaW5kZXhPZih0ZXh0KSAhPSAtMSk7XG5cbiAgICByZXR1cm4gbmV3IFRva2VuKHN0YXJ0LCB0ZXh0KS53aXRoT3AodGV4dCk7XG4gIH1cblxuICBzY2FuSWRlbnRpZmllcigpIHtcbiAgICBhc3NlcnQoaXNJZGVudGlmaWVyU3RhcnQodGhpcy5wZWVrKSk7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblxuICAgIHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgd2hpbGUgKGlzSWRlbnRpZmllclBhcnQodGhpcy5wZWVrKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuXG4gICAgdmFyIHRleHQgPSB0aGlzLmlucHV0LnN1YnN0cmluZyhzdGFydCwgdGhpcy5pbmRleCk7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBUb2tlbihzdGFydCwgdGV4dCk7XG5cbiAgICAvLyBUT0RPKGthc3BlcmwpOiBEZWFsIHdpdGggbnVsbCwgdW5kZWZpbmVkLCB0cnVlLCBhbmQgZmFsc2UgaW5cbiAgICAvLyBhIGNsZWFuZXIgYW5kIGZhc3RlciB3YXkuXG4gICAgaWYgKE9QRVJBVE9SUy5pbmRleE9mKHRleHQpICE9PSAtMSkge1xuICAgICAgcmVzdWx0LndpdGhPcCh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LndpdGhHZXR0ZXJTZXR0ZXIodGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHNjYW5OdW1iZXIoc3RhcnQpIHtcbiAgICBhc3NlcnQoaXNEaWdpdCh0aGlzLnBlZWspKTtcbiAgICB2YXIgc2ltcGxlID0gKHRoaXMuaW5kZXggPT09IHN0YXJ0KTtcbiAgICB0aGlzLmFkdmFuY2UoKTsgIC8vIFNraXAgaW5pdGlhbCBkaWdpdC5cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoaXNEaWdpdCh0aGlzLnBlZWspKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlayA9PT0gJFBFUklPRCkge1xuICAgICAgICBzaW1wbGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNFeHBvbmVudFN0YXJ0KHRoaXMucGVlaykpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG5cbiAgICAgICAgaWYgKGlzRXhwb25lbnRTaWduKHRoaXMucGVlaykpe1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0RpZ2l0KHRoaXMucGVlaykpe1xuICAgICAgICAgIHRoaXMuZXJyb3IoJ0ludmFsaWQgZXhwb25lbnQnLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHNpbXBsZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cblxuICAgIHZhciB0ZXh0ID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcoc3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgIHZhciB2YWx1ZSA9IHNpbXBsZSA/IHBhcnNlSW50KHRleHQpIDogcGFyc2VGbG9hdCh0ZXh0KTtcbiAgICByZXR1cm4gbmV3IFRva2VuKHN0YXJ0LCB0ZXh0KS53aXRoVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgc2NhblN0cmluZygpIHtcbiAgICBhc3NlcnQodGhpcy5wZWVrID09PSAkU1EgfHwgdGhpcy5wZWVrID09PSAkRFEpO1xuICAgIFxuICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgdmFyIHF1b3RlID0gdGhpcy5wZWVrO1xuXG4gICAgdGhpcy5hZHZhbmNlKCk7ICAvLyBTa2lwIGluaXRpYWwgcXVvdGUuXG5cbiAgICB2YXIgYnVmZmVyO1xuICAgIHZhciBtYXJrZXIgPSB0aGlzLmluZGV4O1xuXG4gICAgd2hpbGUgKHRoaXMucGVlayAhPT0gcXVvdGUpIHtcbiAgICAgIGlmICh0aGlzLnBlZWsgPT09ICRCQUNLU0xBU0gpIHtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVmZmVyLnB1c2godGhpcy5pbnB1dC5zdWJzdHJpbmcobWFya2VyLCB0aGlzLmluZGV4KSk7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgICAgIHZhciB1bmVzY2FwZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMucGVlayA9PT0gJHUpIHtcbiAgICAgICAgICAvLyBUT0RPKGthc3BlcmwpOiBDaGVjayBib3VuZHM/IE1ha2Ugc3VyZSB3ZSBoYXZlIHRlc3RcbiAgICAgICAgICAvLyBjb3ZlcmFnZSBmb3IgdGhpcy5cbiAgICAgICAgICB2YXIgaGV4ID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcodGhpcy5pbmRleCArIDEsIHRoaXMuaW5kZXggKyA1KTtcblxuICAgICAgICAgIGlmKCEvW0EtWjAtOV17NH0vLnRlc3QoaGV4KSl7XG4gICAgICAgICAgICB0aGlzLmVycm9yKGBJbnZhbGlkIHVuaWNvZGUgZXNjYXBlIFtcXFxcdSR7aGV4fV1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1bmVzY2FwZWQgPSBwYXJzZUludChoZXgsIDE2KTtcbiAgICAgICAgICBcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU7ICsraSkge1xuICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuZXNjYXBlZCA9IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLnBlZWspO1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVmZmVyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh1bmVzY2FwZWQpKTtcbiAgICAgICAgbWFya2VyID0gdGhpcy5pbmRleDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrID09PSAkRU9GKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoJ1VudGVybWluYXRlZCBxdW90ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhc3QgPSB0aGlzLmlucHV0LnN1YnN0cmluZyhtYXJrZXIsIHRoaXMuaW5kZXgpO1xuICAgIHRoaXMuYWR2YW5jZSgpOyAgLy8gU2tpcCB0ZXJtaW5hdGluZyBxdW90ZS5cbiAgICB2YXIgdGV4dCA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCB0aGlzLmluZGV4KTtcblxuICAgIC8vIENvbXB1dGUgdGhlIHVuZXNjYXBlZCBzdHJpbmcgdmFsdWUuXG4gICAgdmFyIHVuZXNjYXBlZCA9IGxhc3Q7XG5cbiAgICBpZiAoYnVmZmVyICE9IG51bGwpIHtcbiAgICAgIGJ1ZmZlci5wdXNoKGxhc3QpO1xuICAgICAgdW5lc2NhcGVkID0gYnVmZmVyLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVG9rZW4oc3RhcnQsIHRleHQpLndpdGhWYWx1ZSh1bmVzY2FwZWQpO1xuICB9XG5cbiAgYWR2YW5jZSgpIHtcbiAgICBpZiAoKyt0aGlzLmluZGV4ID49IHRoaXMubGVuZ3RoKXtcbiAgICAgIHRoaXMucGVlayA9ICRFT0Y7XG4gICAgfWVsc2Uge1xuICAgICAgdGhpcy5wZWVrID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2UsIG9mZnNldD0wKSB7XG4gICAgLy8gVE9ETyhrYXNwZXJsKTogVHJ5IHRvIGdldCByaWQgb2YgdGhlIG9mZnNldC4gSXQgaXMgb25seSB1c2VkIHRvIG1hdGNoXG4gICAgLy8gdGhlIGVycm9yIGV4cGVjdGF0aW9ucyBpbiB0aGUgbGV4ZXIgdGVzdHMgZm9yIG51bWJlcnMgd2l0aCBleHBvbmVudHMuXG4gICAgdmFyIHBvc2l0aW9uID0gdGhpcy5pbmRleCArIG9mZnNldDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYExleGVyIEVycm9yOiAke21lc3NhZ2V9IGF0IGNvbHVtbiAke3Bvc2l0aW9ufSBpbiBleHByZXNzaW9uIFske3RoaXMuaW5wdXR9XWApO1xuICB9XG59XG5cbnZhciBPUEVSQVRPUlMgPSBbXG4gICd1bmRlZmluZWQnLFxuICAnbnVsbCcsXG4gICd0cnVlJyxcbiAgJ2ZhbHNlJyxcbiAgJysnLFxuICAnLScsXG4gICcqJyxcbiAgJy8nLFxuICAnJScsXG4gICdeJyxcbiAgJz0nLFxuICAnPT0nLFxuICAnPT09JyxcbiAgJyE9JyxcbiAgJyE9PScsXG4gICc8JyxcbiAgJz4nLFxuICAnPD0nLFxuICAnPj0nLFxuICAnJiYnLFxuICAnfHwnLFxuICAnJicsXG4gICd8JyxcbiAgJyEnLFxuICAnPycsXG5dO1xuXG52YXIgJEVPRiAgICAgICA9IDA7XG52YXIgJFRBQiAgICAgICA9IDk7XG52YXIgJExGICAgICAgICA9IDEwO1xudmFyICRWVEFCICAgICAgPSAxMTtcbnZhciAkRkYgICAgICAgID0gMTI7XG52YXIgJENSICAgICAgICA9IDEzO1xudmFyICRTUEFDRSAgICAgPSAzMjtcbnZhciAkQkFORyAgICAgID0gMzM7XG52YXIgJERRICAgICAgICA9IDM0O1xudmFyICQkICAgICAgICAgPSAzNjtcbnZhciAkUEVSQ0VOVCAgID0gMzc7XG52YXIgJEFNUEVSU0FORCA9IDM4O1xudmFyICRTUSAgICAgICAgPSAzOTtcbnZhciAkTFBBUkVOICAgID0gNDA7XG52YXIgJFJQQVJFTiAgICA9IDQxO1xudmFyICRTVEFSICAgICAgPSA0MjtcbnZhciAkUExVUyAgICAgID0gNDM7XG52YXIgJENPTU1BICAgICA9IDQ0O1xudmFyICRNSU5VUyAgICAgPSA0NTtcbnZhciAkUEVSSU9EICAgID0gNDY7XG52YXIgJFNMQVNIICAgICA9IDQ3O1xudmFyICRDT0xPTiAgICAgPSA1ODtcbnZhciAkU0VNSUNPTE9OID0gNTk7XG52YXIgJExUICAgICAgICA9IDYwO1xudmFyICRFUSAgICAgICAgPSA2MTtcbnZhciAkR1QgICAgICAgID0gNjI7XG52YXIgJFFVRVNUSU9OICA9IDYzO1xuXG52YXIgJDAgPSA0ODtcbnZhciAkOSA9IDU3O1xuXG52YXIgJEEgPSA2NTtcbnZhciAkRSA9IDY5O1xudmFyICRaID0gOTA7XG5cbnZhciAkTEJSQUNLRVQgID0gOTE7XG52YXIgJEJBQ0tTTEFTSCA9IDkyO1xudmFyICRSQlJBQ0tFVCAgPSA5MztcbnZhciAkQ0FSRVQgICAgID0gOTQ7XG52YXIgJF8gICAgICAgICA9IDk1O1xuXG52YXIgJGEgPSA5NztcbnZhciAkZSA9IDEwMTtcbnZhciAkZiA9IDEwMjtcbnZhciAkbiA9IDExMDtcbnZhciAkciA9IDExNDtcbnZhciAkdCA9IDExNjtcbnZhciAkdSA9IDExNztcbnZhciAkdiA9IDExODtcbnZhciAkeiA9IDEyMjtcblxudmFyICRMQlJBQ0UgPSAxMjM7XG52YXIgJEJBUiAgICA9IDEyNDtcbnZhciAkUkJSQUNFID0gMTI1O1xudmFyICROQlNQICAgPSAxNjA7XG5cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjb2RlKSB7XG4gIHJldHVybiAoY29kZSA+PSAkVEFCICYmIGNvZGUgPD0gJFNQQUNFKSB8fCAoY29kZSA9PT0gJE5CU1ApO1xufVxuXG5mdW5jdGlvbiBpc0lkZW50aWZpZXJTdGFydChjb2RlKSB7XG4gIHJldHVybiAoJGEgPD0gY29kZSAmJiBjb2RlIDw9ICR6KVxuICAgICAgfHwgKCRBIDw9IGNvZGUgJiYgY29kZSA8PSAkWilcbiAgICAgIHx8IChjb2RlID09PSAkXylcbiAgICAgIHx8IChjb2RlID09PSAkJCk7XG59XG5cbmZ1bmN0aW9uIGlzSWRlbnRpZmllclBhcnQoY29kZSkge1xuICByZXR1cm4gKCRhIDw9IGNvZGUgJiYgY29kZSA8PSAkeilcbiAgICAgIHx8ICgkQSA8PSBjb2RlICYmIGNvZGUgPD0gJFopXG4gICAgICB8fCAoJDAgPD0gY29kZSAmJiBjb2RlIDw9ICQ5KVxuICAgICAgfHwgKGNvZGUgPT09ICRfKVxuICAgICAgfHwgKGNvZGUgPT09ICQkKTtcbn1cblxuZnVuY3Rpb24gaXNEaWdpdChjb2RlKSB7XG4gIHJldHVybiAoJDAgPD0gY29kZSAmJiBjb2RlIDw9ICQ5KTtcbn1cblxuZnVuY3Rpb24gaXNFeHBvbmVudFN0YXJ0KGNvZGUpIHtcbiAgcmV0dXJuIChjb2RlID09PSAkZSB8fCBjb2RlID09PSAkRSk7XG59XG5cbmZ1bmN0aW9uIGlzRXhwb25lbnRTaWduKGNvZGUpIHtcbiAgcmV0dXJuIChjb2RlID09PSAkTUlOVVMgfHwgY29kZSA9PT0gJFBMVVMpO1xufVxuXG5mdW5jdGlvbiB1bmVzY2FwZShjb2RlKSB7XG4gIHN3aXRjaChjb2RlKSB7XG4gICAgY2FzZSAkbjogcmV0dXJuICRMRjtcbiAgICBjYXNlICRmOiByZXR1cm4gJEZGO1xuICAgIGNhc2UgJHI6IHJldHVybiAkQ1I7XG4gICAgY2FzZSAkdDogcmV0dXJuICRUQUI7XG4gICAgY2FzZSAkdjogcmV0dXJuICRWVEFCO1xuICAgIGRlZmF1bHQ6IHJldHVybiBjb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB0aHJvdyBtZXNzYWdlIHx8IFwiQXNzZXJ0aW9uIGZhaWxlZFwiO1xuICB9XG59XG4iXX0=